home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d882.lha / GALer / GALer_english / Source / GALerSrcE.lha / Sub.c < prev   
C/C++ Source or Header  |  1993-06-08  |  40KB  |  1,552 lines

  1. /****************************************************************/
  2. /*                                */
  3. /* Sub.c - dieses Modul enthält Unterroutinen für den GALer    */
  4. /*                                */
  5. /* compilieren: cc sub.c                    */
  6. /*                                */
  7. /****************************************************************/
  8.  
  9.  
  10.  
  11. #include <exec/types.h>
  12. #include <libraries/dos.h>
  13. #include <libraries/dosextens.h>
  14. #include <exec/memory.h>
  15. #include <intuition/intuition.h>
  16. #include <stdio.h>
  17. #include <ctype.h>
  18. #include <functions.h>
  19.  
  20. #include "GALer.h"
  21. #include "reqbase.h"
  22.  
  23.  
  24. #define    YES_GADID    1
  25. #define    NO_GADID    2
  26.  
  27. #define    GALGAL_GADID    3
  28. #define    GALJEDEC_GADID    4
  29. #define    JEDECGAL_GADID    5
  30.  
  31. #define JEDEC_GADID    1
  32. #define FUSE_GADID    2
  33. #define CHIP_GADID    3
  34. #define PIN_GADID    4
  35. #define AUTOSAVE_GADID    5
  36. #define AUTOGAL_GADID    6
  37. #define WEITER_GADID    7
  38. #define ABBRUCH_GADID    8
  39.  
  40. #define    JED_SEC_GADID    3
  41. #define    JED_FSCHK_GADID    4
  42. #define    JED_FLCHK_GADID    5
  43.  
  44.  
  45. extern    struct    Window     *window;
  46. extern    struct    RastPort *rp;
  47. extern    struct    MenuItem MenuItem13, MenuItem13b;
  48. extern    struct    MenuItem MenuItem14, MenuItem14a, MenuItem14b;
  49.  
  50. extern    int    GALType, MaxFuseAdr, SigAdr;
  51. extern    UBYTE    title[];
  52.  
  53. int    ytxt = 160;                /*Startpos. für PrintText*/
  54.  
  55.  
  56.                         /*Voreinstellungen*/
  57. struct    Configuration Config = { GAL16V8,    /*GAL16V8*/
  58.                  NO,        /*kein A-Typ*/
  59.                  YES,        /*Requester für Typ*/
  60.                  YES,        /*auto. A-Typ-Erkennung*/
  61.                  YES,        /*Jedec erzeugen*/
  62.                  NO,        /*kein Fuse-File*/
  63.                  NO,        /*kein Chip-File*/
  64.                  NO,        /*kein Pin-File*/
  65.                  NO,        /*kein Auto-Save*/
  66.                  YES,        /*autom. GALTyp einstellen*/
  67.                  YES,        /*Leertest vor GAL-Prog.*/
  68.                  YES,        /*Verify nach GAL-Prog.*/
  69.                  YES,        /*Leertest vor Copy-GAL*/
  70.                  YES,        /*Verify nach Copy-GAL*/
  71.                  YES,        /*Leertest nach GAL-Löschen*/
  72.                  NO,        /*Sec.Bit der Jedec-Datei*/
  73.                  YES,        /*Fuse-Checksumme der Jedec*/
  74.                  NO        /*File-Checksumme der Jedec*/
  75.                         };
  76.  
  77.  
  78. struct    Configuration DummyConfig;        /*für LoadConfig*/
  79.  
  80.  
  81.  
  82.  
  83. UBYTE    ErrorLineStr[] = "Error in line   ....:";
  84.  
  85.  
  86.  
  87. SHORT BorderVectorsRa[] = { 0,14,82,14,82,0 };
  88. SHORT BorderVectorsRb[] = { 0,14,0,0,82,0 };
  89.  
  90. struct Border BorderRb  = {-1,-1,2,0,JAM1,3,BorderVectorsRb,NULL};
  91. struct Border BorderRa  = {-1,-1,1,0,JAM1,3,BorderVectorsRa,&BorderRb};
  92.  
  93.  
  94. struct IntuiText ITextN = {2,0,JAM1,14,3,NULL,NULL,NULL};
  95. struct IntuiText ITextY = {2,0,JAM1,16,3,NULL,NULL,NULL};
  96.  
  97.  
  98. struct Gadget GadgetN = {NULL,206,53,81,13,NULL,RELVERIFY,
  99.              BOOLGADGET+REQGADGET,
  100.              (APTR)&BorderRa,NULL,&ITextN,NULL,NULL,NO_GADID,NULL};
  101. struct Gadget GadgetY = {&GadgetN,26,53,81,13,NULL,RELVERIFY,
  102.              BOOLGADGET+REQGADGET,
  103.              (APTR)&BorderRa,NULL,&ITextY,NULL,NULL,YES_GADID,NULL};
  104.  
  105.  
  106.  
  107. struct IntuiText ITextW = {2,0,JAM1,19,15,NULL,NULL,NULL};
  108.  
  109.  
  110.  
  111.  
  112. SHORT SBorderVectors1a[] = { 0,12,73,12,73,0 };
  113. SHORT SBorderVectors1b[] = { 0,12,0,0,73,0 };
  114.  
  115. SHORT SBorderVectors2a[] = { 0,14,85,14,85,0 };
  116. SHORT SBorderVectors2b[] = { 0,14,0,0,85,0 };
  117.  
  118. SHORT SBorderVectors3a[] = { 0,8,14,8,14,0 };
  119. SHORT SBorderVectors3b[] = { 0,8,0,0,14,0 };
  120.  
  121.  
  122. struct Border SBorder1b    = { -1,-1,2,0,JAM1,3,SBorderVectors1b,NULL };
  123. struct Border SBorder1a    = { -1,-1,1,0,JAM1,3,SBorderVectors1a,&SBorder1b };
  124.  
  125. struct Border SBorder2b    = { -1,-1,2,0,JAM1,3,SBorderVectors2b,NULL };
  126. struct Border SBorder2a    = { -1,-1,1,0,JAM1,3,SBorderVectors2a,&SBorder2b };
  127.  
  128. struct Border SBorder3b    = { -1,-1,2,0,JAM1,3,SBorderVectors3b,NULL};
  129. struct Border SBorder3a    = { -1,-1,1,0,JAM1,3,SBorderVectors3a,&SBorder3b};
  130.  
  131.  
  132.  
  133.  
  134. struct IntuiText SIText1 = { 2,0,JAM1,9,2,NULL,
  135.                 (UBYTE *)"Cancel",NULL };
  136.  
  137. struct IntuiText SIText2 = { 2,0,JAM1,13,2,NULL,
  138.                 (UBYTE *)" Cont",NULL };
  139.  
  140. struct IntuiText SIText4 = { 2,0,JAM1,22,0,NULL,
  141.                 (UBYTE *)"adjust type of GAL",NULL };
  142.  
  143. struct IntuiText SIText8 = { 2,0,JAM1,22,0,NULL,
  144.                 (UBYTE *)"Autosave",NULL };
  145.  
  146. struct IntuiText SIText9 = { 2,0,JAM1,22,0,NULL,
  147.                 (UBYTE *)"Pin-Diagram",NULL };
  148.  
  149. struct IntuiText SIText10= { 2,0,JAM1,22,0,NULL,
  150.                  (UBYTE *)"Chip-Diagram",NULL };
  151.  
  152. struct IntuiText SIText11= { 2,0,JAM1,22,0,NULL,
  153.                 (UBYTE *)"Fuse-Matrix",NULL };
  154.  
  155. struct IntuiText SIText12= { 2,0,JAM1,22,0,NULL,
  156.                 (UBYTE *)"JEDEC",NULL };
  157.  
  158. struct IntuiText SIText13= { 2,0,JAM1,15,18,NULL,
  159.                 (UBYTE *)"save files:", NULL };
  160.  
  161. struct IntuiText SIText14= { 2,0,JAM1,14,3,NULL,
  162.                 (UBYTE *)"Cancel",NULL };
  163.  
  164. struct IntuiText SIText15= { 2,0,JAM1,6,3,NULL,
  165.                 (UBYTE *)"GAL20V8 A",NULL };
  166.  
  167. struct IntuiText SIText16= { 2,0,JAM1,14,3,NULL,
  168.                 (UBYTE *)"GAL20V8",NULL };
  169.  
  170. struct IntuiText SIText17= { 2,0,JAM1,6,3,NULL,
  171.                 (UBYTE *)"GAL16V8 A",NULL };
  172.  
  173. struct IntuiText SIText18= { 2,0,JAM1,14,3,NULL,
  174.                 (UBYTE *)"GAL16V8",NULL };
  175.  
  176. struct IntuiText SIText20= { 2,0,JAM1,0,15,NULL,NULL,NULL };
  177.  
  178. struct IntuiText SIText19= { 2,0,JAM1,8,30,NULL,
  179.                 (UBYTE *)"     Please insert GAL and select type of GAL.",&SIText20 };
  180.  
  181. struct IntuiText SIText21= { 2,0,JAM1,21,2,NULL,
  182.                  (UBYTE *)"O.K.",NULL };
  183.  
  184.  
  185. struct IntuiText SIText30= { 2,0,JAM1,6,3,NULL,
  186.                 (UBYTE *)" GAL-GAL",NULL };
  187.  
  188. struct IntuiText SIText31= { 2,0,JAM1,6,3,NULL,
  189.                 (UBYTE *)"GAL-JEDEC",NULL };
  190.  
  191. struct IntuiText SIText32= { 2,0,JAM1,6,3,NULL,
  192.                 (UBYTE *)"JEDEC-GAL",NULL };
  193.  
  194. struct IntuiText SIText33= { 2,0,JAM1,19,20,NULL,
  195.                 (UBYTE *)"   Please select kind of comparison.",NULL };
  196.  
  197.  
  198. struct IntuiText SIText44= { 2,0,JAM1,22,0,NULL,
  199.                 (UBYTE *)"with verify",NULL };
  200.  
  201. struct IntuiText SIText43= { 2,0,JAM1,22,0,NULL,
  202.                 (UBYTE *)"with blank test",NULL };
  203.  
  204. struct IntuiText SIText42= { 2,0,JAM1,15,10,NULL,
  205.                 (UBYTE *)"programming:", NULL };
  206.  
  207. struct IntuiText SIText41= { 2,0,JAM1,15,45,NULL,
  208.                 (UBYTE *)"copying", &SIText42 };
  209.  
  210. struct IntuiText SIText40= { 2,0,JAM1,15,80,NULL,
  211.                 (UBYTE *)"erasing:", &SIText41 };
  212.  
  213.  
  214.  
  215. struct IntuiText SIText53= { 2,0,JAM1,22,0,NULL,
  216.                 (UBYTE *)"File-Checksum",NULL };
  217.  
  218. struct IntuiText SIText52= { 2,0,JAM1,22,0,NULL,
  219.                 (UBYTE *)"Fuse-Checksum",NULL };
  220.  
  221. struct IntuiText SIText51= { 2,0,JAM1,22,0,NULL,
  222.                 (UBYTE *)"Security bit",NULL };
  223.  
  224. struct IntuiText SITextJR= { 2,0,JAM1,15,10,NULL,
  225.                 (UBYTE *)"write JEDEC file:",NULL };
  226.  
  227.  
  228.  
  229. struct IntuiText AboutTxt7 = {2,0,JAM1,177,75,NULL,
  230.                   (UBYTE *)"Germany",NULL };
  231.  
  232. struct IntuiText AboutTxt6 = {2,0,JAM1,177,65,NULL,
  233.                   (UBYTE *)"85356 Freising",&AboutTxt7 };
  234.  
  235. struct IntuiText AboutTxt5 = {2,0,JAM1,177,55,NULL,
  236.                   (UBYTE *)"Asamstr. 17",&AboutTxt6 };
  237.  
  238. struct IntuiText AboutTxt4 = {2,0,JAM1,25,45,NULL,
  239.                   (UBYTE *)"My address:        Christian Habermann",&AboutTxt5 };
  240.  
  241. struct IntuiText AboutTxt3 = {2,0,JAM1,25,30,NULL,
  242.                   (UBYTE *)"donation of 15 US $ (see manual). Thank you!",&AboutTxt4 };
  243.  
  244. struct IntuiText AboutTxt2 = {2,0,JAM1,25,20,NULL,
  245.                   (UBYTE *)"program  and / or  the  hardware,  please send me a",&AboutTxt3 };
  246.  
  247. struct IntuiText AboutTxt1 = {2,0,JAM1,25,10,NULL,
  248.                   (UBYTE *)"The project 'GALer' is  SHAREWARE.  If you use this",&AboutTxt2 };
  249.  
  250.  
  251.  
  252. struct IntuiText ATypeTxt  = {2,0,JAM1,75,30,NULL,
  253.                   (UBYTE *)"and select type of GAL." };
  254.  
  255.  
  256.  
  257. struct Gadget SGadget12 = { NULL,179,120,72,11,
  258.                 NULL,
  259.                 RELVERIFY,
  260.                 BOOLGADGET+REQGADGET,
  261.                 (APTR)&SBorder1a,NULL,
  262.                 &SIText1,NULL,NULL,ABBRUCH_GADID,NULL };
  263.  
  264. struct Gadget SGadget11 = { &SGadget12,18,120,72,11,
  265.                 NULL,
  266.                 RELVERIFY,
  267.                 BOOLGADGET+REQGADGET,
  268.                 (APTR)&SBorder1a,NULL,
  269.                 &SIText2,NULL,NULL,WEITER_GADID,NULL };
  270.  
  271. struct Gadget SGadget9  = { &SGadget11,18,91,13,7,
  272.                 NULL,
  273.                 RELVERIFY+TOGGLESELECT,
  274.                 BOOLGADGET+REQGADGET,
  275.                 (APTR)&SBorder3a,NULL,
  276.                 &SIText4,NULL,NULL,AUTOGAL_GADID,NULL };
  277.  
  278. struct Gadget SGadget5  = { &SGadget9,62,72,13,7,
  279.                 NULL,
  280.                 RELVERIFY+TOGGLESELECT,
  281.                 BOOLGADGET+REQGADGET,
  282.                 (APTR)&SBorder3a,NULL,
  283.                 &SIText8,NULL,NULL,AUTOSAVE_GADID,NULL };
  284.  
  285. struct Gadget SGadget4  = { &SGadget5,62,59,13,7,
  286.                 NULL,
  287.                 RELVERIFY+TOGGLESELECT,
  288.                 BOOLGADGET+REQGADGET,
  289.                 (APTR)&SBorder3a,NULL,
  290.                 &SIText9,NULL,NULL,PIN_GADID,NULL };
  291.  
  292. struct Gadget SGadget3  = { &SGadget4,62,49,13,7,
  293.                 NULL,
  294.                 RELVERIFY+TOGGLESELECT,
  295.                 BOOLGADGET+REQGADGET,
  296.                 (APTR)&SBorder3a,NULL,
  297.                 &SIText10,NULL,NULL,CHIP_GADID,NULL };
  298.  
  299. struct Gadget SGadget2  = { &SGadget3,62,39,13,7,
  300.                 NULL,
  301.                 RELVERIFY+TOGGLESELECT,
  302.                 BOOLGADGET+REQGADGET,
  303.                 (APTR)&SBorder3a,NULL,
  304.                 &SIText11,NULL,NULL,FUSE_GADID,NULL };
  305.  
  306. struct Gadget SGadget1  = { &SGadget2,62,29,13,7,
  307.                 NULL,
  308.                 RELVERIFY+TOGGLESELECT,
  309.                 BOOLGADGET+REQGADGET,
  310.                 (APTR)&SBorder3a,NULL,
  311.                 &SIText12,NULL,NULL,JEDEC_GADID,NULL };
  312.  
  313.  
  314.  
  315. struct Gadget SGadget24 = { NULL,164,77,84,13,NULL,
  316.                 RELVERIFY,
  317.                 BOOLGADGET+REQGADGET,
  318.                 (APTR)&SBorder2a,NULL,
  319.                 &SIText14,NULL,NULL,NO_GADID,NULL };
  320.  
  321. struct Gadget SGadget23 = { &SGadget24,312,50,84,13,NULL,
  322.                 RELVERIFY,
  323.                 BOOLGADGET+REQGADGET,
  324.                 (APTR)&SBorder2a,NULL,
  325.                 &SIText15,NULL,NULL,6,NULL };
  326.  
  327. struct Gadget SGadget22 = { &SGadget23,216,50,84,13,NULL,
  328.                 RELVERIFY,
  329.                 BOOLGADGET+REQGADGET,
  330.                 (APTR)&SBorder2a,NULL,
  331.                 &SIText16,NULL,NULL,5,NULL };
  332.  
  333. struct Gadget SGadget21 = { &SGadget22,121,50,84,13,NULL,
  334.                 RELVERIFY,
  335.                 BOOLGADGET+REQGADGET,
  336.                 (APTR)&SBorder2a,NULL,
  337.                 &SIText17,NULL,NULL,4,NULL };
  338.  
  339. struct Gadget SGadget20 = { &SGadget21,25,50,84,13,NULL,
  340.                 RELVERIFY,
  341.                 BOOLGADGET+REQGADGET,
  342.                 (APTR)&SBorder2a,NULL,
  343.                 &SIText18,NULL,NULL,3,NULL };
  344.  
  345.  
  346.  
  347. struct Gadget SGadget33 = { NULL,133,77,84,13,NULL,
  348.                 RELVERIFY,
  349.                 BOOLGADGET+REQGADGET,
  350.                 (APTR)&SBorder2a,NULL,
  351.                 &SIText14,NULL,NULL,NO_GADID,NULL };
  352.  
  353. struct Gadget SGadget32 = { &SGadget33,240,50,84,13,NULL,
  354.                 RELVERIFY,
  355.                 BOOLGADGET+REQGADGET,
  356.                 (APTR)&SBorder2a,NULL,
  357.                 &SIText32,NULL,NULL,JEDECGAL_GADID,NULL };
  358.  
  359. struct Gadget SGadget31 = { &SGadget32,133,50,84,13,NULL,
  360.                 RELVERIFY,
  361.                 BOOLGADGET+REQGADGET,
  362.                 (APTR)&SBorder2a,NULL,
  363.                 &SIText31,NULL,NULL,GALJEDEC_GADID,NULL };
  364.  
  365. struct Gadget SGadget30 = { &SGadget31,25,50,84,13,NULL,
  366.                 RELVERIFY,
  367.                 BOOLGADGET+REQGADGET,
  368.                 (APTR)&SBorder2a,NULL,
  369.                 &SIText30,NULL,NULL,GALGAL_GADID,NULL };
  370.  
  371.  
  372.  
  373. struct Gadget SGadget46 = { NULL,45,90,13,7,
  374.                 NULL,
  375.                 RELVERIFY+TOGGLESELECT,
  376.                 BOOLGADGET+REQGADGET,
  377.                 (APTR)&SBorder3a,NULL,
  378.                 &SIText43,NULL,NULL,7,NULL };
  379.  
  380. struct Gadget SGadget45 = { &SGadget46,45,65,13,7,
  381.                 NULL,
  382.                 RELVERIFY+TOGGLESELECT,
  383.                 BOOLGADGET+REQGADGET,
  384.                 (APTR)&SBorder3a,NULL,
  385.                 &SIText44,NULL,NULL,6,NULL };
  386.  
  387. struct Gadget SGadget44 = { &SGadget45,45,55,13,7,
  388.                 NULL,
  389.                 RELVERIFY+TOGGLESELECT,
  390.                 BOOLGADGET+REQGADGET,
  391.                 (APTR)&SBorder3a,NULL,
  392.                 &SIText43,NULL,NULL,5,NULL };
  393.  
  394. struct Gadget SGadget43 = { &SGadget44,45,30,13,7,
  395.                 NULL,
  396.                 RELVERIFY+TOGGLESELECT,
  397.                 BOOLGADGET+REQGADGET,
  398.                 (APTR)&SBorder3a,NULL,
  399.                 &SIText44,NULL,NULL,4,NULL };
  400.  
  401. struct Gadget SGadget42 = { &SGadget43,45,20,13,7,
  402.                 NULL,
  403.                 RELVERIFY+TOGGLESELECT,
  404.                 BOOLGADGET+REQGADGET,
  405.                 (APTR)&SBorder3a,NULL,
  406.                 &SIText43,NULL,NULL,3,NULL };
  407.  
  408. struct Gadget SGadget40 = { &SGadget42,98,115,72,11,
  409.                 NULL,
  410.                 RELVERIFY,
  411.                 BOOLGADGET+REQGADGET,
  412.                 (APTR)&SBorder1a,NULL,
  413.                 &SIText21,NULL,NULL,YES_GADID,NULL };
  414.  
  415.  
  416.  
  417. struct Gadget SGadget53 = { NULL,25,42,13,7,
  418.                 NULL,
  419.                 RELVERIFY+TOGGLESELECT,
  420.                 BOOLGADGET+REQGADGET,
  421.                 (APTR)&SBorder3a,NULL,
  422.                 &SIText53,NULL,NULL,JED_FLCHK_GADID,NULL };
  423.  
  424. struct Gadget SGadget52 = { &SGadget53,25,32,13,7,
  425.                 NULL,
  426.                 RELVERIFY+TOGGLESELECT,
  427.                 BOOLGADGET+REQGADGET,
  428.                 (APTR)&SBorder3a,NULL,
  429.                 &SIText52,NULL,NULL,JED_FSCHK_GADID,NULL };
  430.  
  431. struct Gadget SGadget51 = { &SGadget52,25,22,13,7,
  432.                 NULL,
  433.                 RELVERIFY+TOGGLESELECT,
  434.                 BOOLGADGET+REQGADGET,
  435.                 (APTR)&SBorder3a,NULL,
  436.                 &SIText51,NULL,NULL,JED_SEC_GADID,NULL };
  437.  
  438. struct Gadget SGadget50 = { &SGadget51,71,62,72,11,
  439.                 NULL,
  440.                 RELVERIFY,
  441.                 BOOLGADGET+REQGADGET,
  442.                 (APTR)&SBorder1a,NULL,
  443.                 &SIText21,NULL,NULL,YES_GADID,NULL };
  444.  
  445.  
  446. struct Gadget AboutGad = {  NULL,198,95,72,11,NULL,
  447.                 RELVERIFY,
  448.                 BOOLGADGET+REQGADGET,
  449.                 (APTR)&SBorder1a,NULL,
  450.                 &SIText21,NULL,NULL,1,NULL };
  451.  
  452.  
  453.  
  454. SHORT ReqBorVeca[]   = { 0,75,309,75,309,0 };
  455. SHORT ReqBorVecb[]   = { 0,75,0,0,309,0 };
  456.  
  457. SHORT cmpBorVeca[]   = { 0,96,349,96,349,0 };
  458. SHORT cmpBorVecb[]   = { 0,96,0,0,349,0 };
  459.  
  460. SHORT asmBorVeca[]   = { 0,139,271,139,271,0 };
  461. SHORT asmBorVecb[]   = { 0,139,0,0,271,0 };
  462.  
  463. SHORT VerBorVeca[]   = { 0,139,271,139,271,0 };
  464. SHORT VerBorVecb[]   = { 0,139,0,0,271,0 };
  465.  
  466. SHORT TypeBorVeca[]  = { 0,96,423,96,423,0 };
  467. SHORT TypeBorVecb[]  = { 0,96,0,0,423,0 };
  468.  
  469. SHORT AboutBorVeca[] = { 0,117,467,117,467,0 };
  470. SHORT AboutBorVecb[] = { 0,117,0,0,467,0 };
  471.  
  472. SHORT JedecBorVeca[] = { 0,79,204,79,204,0 };
  473. SHORT JedecBorVecb[] = { 0,79,0,0,204,0 };
  474.  
  475.  
  476. struct Border ReqBorderb    = { 0,0,2,0,JAM1,3,ReqBorVecb,NULL};
  477. struct Border ReqBordera    = { 0,0,1,0,JAM1,3,ReqBorVeca,&ReqBorderb};
  478.  
  479. struct Border cmpBorderb    = { 0,0,2,0,JAM1,3,cmpBorVecb,NULL};
  480. struct Border cmpBordera    = { 0,0,1,0,JAM1,3,cmpBorVeca,&cmpBorderb};
  481.  
  482. struct Border asmBorderb    = { 0,0,2,0,JAM1,3,asmBorVecb,NULL};
  483. struct Border asmBordera    = { 0,0,1,0,JAM1,3,asmBorVeca,&asmBorderb};
  484.  
  485. struct Border TypeBorderb   = { 0,0,2,0,JAM1,3,TypeBorVecb,NULL};
  486. struct Border TypeBordera   = { 0,0,1,0,JAM1,3,TypeBorVeca,&TypeBorderb};
  487.  
  488. struct Border AboutBorderb  = { 0,0,2,0,JAM1,3,AboutBorVecb,NULL};
  489. struct Border AboutBordera  = { 0,0,1,0,JAM1,3,AboutBorVeca,&AboutBorderb};
  490.  
  491. struct Border JedecBorderb  = { 0,0,2,0,JAM1,3,JedecBorVecb,NULL};
  492. struct Border JedecBordera  = { 0,0,1,0,JAM1,3,JedecBorVeca,&JedecBorderb};
  493.  
  494.  
  495.  
  496. struct Requester req     = { NULL,170,40,310,76,0,0,
  497.                 &GadgetY,&ReqBordera,&ITextW,
  498.                 NOISYREQ,3,NULL,NULL,NULL };
  499.  
  500.  
  501. struct Requester cmpreq  = { NULL,145,30,350,97,0,0,
  502.                 &SGadget30,&cmpBordera,&SIText33,
  503.                 NOISYREQ,3,NULL,NULL,NULL };
  504.  
  505.  
  506. struct Requester asmreq  = { NULL,184,20,272,140,0,0,
  507.                 &SGadget1,&asmBordera,&SIText13,
  508.                 NOISYREQ,3,NULL,NULL,NULL };
  509.  
  510.  
  511. struct Requester VerReq  = { NULL,184,20,272,140,0,0,
  512.                 &SGadget40,&asmBordera,&SIText40,
  513.                 NOISYREQ,3,NULL,NULL,NULL };
  514.  
  515.  
  516. struct Requester TypeReq = { NULL,114,30,424,97,0,0,
  517.                 &SGadget20,&TypeBordera,&SIText19,
  518.                 NOISYREQ,3,NULL,NULL,NULL };
  519.  
  520.  
  521. struct Requester AboutReq={ NULL,86,18,468,118,0,0,
  522.                 &AboutGad,&AboutBordera,&AboutTxt1,
  523.                 NOISYREQ,3,NULL,NULL,NULL };
  524.  
  525.  
  526. struct Requester JedecReq={ NULL,217,30,205,80,0,0,
  527.                 &SGadget50,&JedecBordera,&SITextJR,
  528.                 NOISYREQ,3,NULL,NULL,NULL };
  529.  
  530.  
  531.  
  532.  
  533. char    filename[FCHARS+4];            /*Puffer für Filenamen*/
  534. char    directoryname[DSIZE];            /*Puffer für Directory*/
  535. char    path[DSIZE+FCHARS+4];            /*Puffer für Dir+File*/
  536.                         /*+4 für Suffix*/
  537.  
  538. struct ReqFileRequester    MyFileReqStruct =    /*FileRequester aus req.lib*/
  539.             { 
  540.              REQVERSION, NULL,
  541.              (char *)&directoryname,
  542.              (char *)&filename,
  543.              (char *)&path,
  544.              NULL,
  545.              0,12,32,10,
  546.              FRQCACHINGM|FRQINFOGADGETM|FRQABSOLUTEXYM,
  547.              1,2,2,0,0,        /*Dir,File,Dev,Font,Fontsize*/
  548.              2,1,            /*Detail,Block-Farben*/
  549.              2,2,2,2,        /*GadTxt,Text,String,StrnGad*/
  550.              2,2,            /*Border,Gadget-Farben*/
  551.             };
  552.  
  553.  
  554.  
  555.  
  556.  
  557. /* Schreibverhalten: Läßt Requester erscheinen, in dem eingestellt werden
  558.              kann ob ein Leertest und/oder Verify nach einem
  559.              schreibenden Zugriff auf ein GAL gemacht werden soll.
  560.    Aufruf   : Schreibverhalten();
  561.    Parameter: ---
  562.    Ergebnis : --- 
  563. */
  564. void Schreibverhalten()
  565. {
  566. struct    IntuiMessage    *imsg;
  567. ULONG    class;
  568. USHORT    code,gadID;
  569.  
  570.  if (Request(&VerReq,window)) {
  571.      for (;;) {
  572.        imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
  573.        if (!imsg) WaitPort (window->UserPort);
  574.        else {
  575.          class = imsg->Class;
  576.      code  = imsg->Code;
  577.      if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
  578.         ReplyMsg(imsg);
  579.      if (class == VANILLAKEY) {
  580.        if (code == 'w') {
  581.          EndRequest(&VerReq,window);
  582.          return;
  583.         }
  584.       }
  585.      if (class == GADGETUP) {
  586.        switch (gadID) {
  587.          case YES_GADID:
  588.         EndRequest(&VerReq,window);
  589.         return;
  590.          case 3:
  591.         Config.ProgEmptyTest = !Config.ProgEmptyTest;
  592.         break;
  593.          case 4:
  594.         Config.ProgVerify = !Config.ProgVerify;
  595.         break;
  596.          case 5:
  597.         Config.CopyEmptyTest = !Config.CopyEmptyTest;
  598.         break;
  599.          case 6:
  600.         Config.CopyVerify = !Config.CopyVerify;
  601.         break;
  602.          case 7:
  603.         Config.EraseEmptyTest = !Config.EraseEmptyTest;
  604.         break;
  605.         }
  606.       }
  607.         }
  608.       }
  609.   }
  610. }
  611.  
  612.  
  613.  
  614. /* JedecRequster: Läßt Requester erscheinen, in dem eingestellt werden kann,
  615.          was wie im Jedec-File stehen soll.
  616.    Aufruf   : JedecReq();
  617.    Parameter: ---
  618.    Ergebnis : --- 
  619. */
  620. void JedecRequester()
  621. {
  622. struct    IntuiMessage    *imsg;
  623. ULONG    class;
  624. USHORT    code,gadID;
  625.  
  626.  if (Request(&JedecReq,window)) {
  627.      for (;;) {
  628.        imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
  629.        if (!imsg) WaitPort (window->UserPort);
  630.        else {
  631.          class = imsg->Class;
  632.      code  = imsg->Code;
  633.      if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
  634.         ReplyMsg(imsg);
  635.      if (class == VANILLAKEY) {
  636.        if (code == 'w') {
  637.          EndRequest(&JedecReq,window);
  638.          return;
  639.         }
  640.       }
  641.      if (class == GADGETUP) {
  642.        switch (gadID) {
  643.          case YES_GADID:
  644.         EndRequest(&JedecReq,window);
  645.         return;
  646.          case JED_SEC_GADID:
  647.         Config.JedecSecBit = !Config.JedecSecBit;
  648.         break;
  649.          case JED_FSCHK_GADID:
  650.         Config.JedecFuseChk = !Config.JedecFuseChk;
  651.         break;
  652.          case JED_FLCHK_GADID:
  653.         Config.JedecFileChk = !Config.JedecFileChk;
  654.         break;
  655.         }
  656.       }
  657.         }
  658.       }
  659.   }
  660. }
  661.  
  662.  
  663.  
  664.  
  665. /* About: zeigt About-Text
  666.    Aufruf   : About();
  667.    Parameter: ---
  668.    Ergebnis : --- 
  669. */
  670. void About()
  671. {
  672. struct    IntuiMessage    *imsg;
  673. ULONG    class;
  674. USHORT    gadID;
  675.  
  676.  if (Request(&AboutReq,window)) {
  677.      for (;;) {
  678.        imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
  679.        if (!imsg) WaitPort (window->UserPort);
  680.        else {
  681.          class = imsg->Class;
  682.      if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
  683.         ReplyMsg(imsg);
  684.      if (class == VANILLAKEY) {
  685.        EndRequest(&AboutReq,window);
  686.        return;
  687.       }
  688.      if (class == GADGETUP) {
  689.        if (gadID == 1) {
  690.          EndRequest(&AboutReq,window);
  691.          return;
  692.         }
  693.       }
  694.         }
  695.       }
  696.   }
  697. }
  698.  
  699.  
  700.  
  701.  
  702. /* mystrcmp: wie strcmp, aber keine Unterscheidung zwischen Groß- und
  703.    Kleinschreibung
  704.    Aufruf: result = mystrcmp(cptr1, cptr2);
  705.        cptr1: Zeiger auf 1. String
  706.        cptr2: Zeiger auf 2. String
  707.    Ergebnis: 
  708.        result = 1: nicht gleich
  709.             = 0: gleich
  710. */
  711. int mystrcmp(cptr1, cptr2)
  712. char *cptr1, *cptr2;
  713. {
  714.   while (*cptr1 && *cptr2) {
  715.     if (_tolower(*cptr1) != _tolower(*cptr2))
  716.       return(1);
  717.     cptr1++;
  718.     cptr2++;
  719.    }
  720.  
  721.   if (!*cptr1 && !*cptr2)
  722.     return(0);
  723.   else
  724.     return(1);
  725. }
  726.  
  727.  
  728. /* MyFileReq: öffnet den FileRequester aus der "req.library"
  729.    Aufruf: antwort = MyFileReq((char *)headtxt, (char *)showtxt, int showreq);
  730.              headtxt: Zeiger auf File-Requester-Titel
  731.          showtxt: Zeiger auf Suffix
  732.          showreq: YES: FileRequester zeigen; NO: keinen Requester
  733.    Ergebnis: 1 : O.K. wurde angeklickt
  734.          0 : Cancel wurde angeklickt
  735. */
  736. int MyFileReq(headtxt,showtxt,showreq)
  737. char *headtxt, *showtxt;
  738. int  showreq;
  739. {
  740. char    *pos1, *pos2;
  741. int    freq = YES;
  742.  
  743.  MyFileReqStruct.WindowLeftEdge = 124;
  744.  
  745.  MyFileReqStruct.Title = headtxt;            /*Überschrift*/
  746.  MyFileReqStruct.Show[0]='#';                /*Show-Text*/
  747.  MyFileReqStruct.Show[1]='?';
  748.  MyFileReqStruct.Show[2]=0;
  749.  strcat(&MyFileReqStruct.Show[0],showtxt);
  750.  
  751.                     /*falls vorhanden, Suffix löschen*/
  752.  if (strlen(&filename[0])>=4) {        /*und "showtxt" anhängen */
  753.    pos1 = (char *)(&filename[0] + (long)strlen(&filename[0]) - (long)strlen(showtxt));
  754.    if ((!mystrcmp(pos1,(char *)".pld")) || (!mystrcmp(pos1,(char *)".jed")) ||
  755.        (!mystrcmp(pos1,(char *)".pin")) || (!mystrcmp(pos1,(char *)".chp")) ||
  756.        (!mystrcmp(pos1,(char *)".fus"))) {
  757.      *pos1 = 0;
  758.      strcat(&filename[0], showtxt);
  759.     }
  760.   }
  761.  
  762.  
  763.  if (showreq)                    /*FileRequester zeigen?*/
  764.    freq = FileRequester(&MyFileReqStruct);
  765.  
  766.  if ((showreq && freq) || !showreq) {
  767.    if (strlen(&filename[0])>=4) {            /*Suffix anhängen*/
  768.      pos1 = (char *)(&filename[0]+(long)strlen(&filename[0])-(long)strlen(showtxt));
  769.        if (mystrcmp(pos1,showtxt)) {        /*Suffix nur anhängen, wenn*/
  770.          strcat(&filename[0], showtxt);        /*es nicht schon da steht  */
  771.          strcat(&path[0], showtxt);
  772.     }
  773.     }
  774.    else {
  775.     if (!strlen(&filename[0]))            /*kein File angegeben?*/
  776.       return(0);                /*dann Abbruch*/
  777.     strcat(&filename[0], showtxt);
  778.     strcat(&path[0], showtxt);
  779.     }
  780.                         /*Wenn kein Requester gezeigt  */
  781.                         /*wurde (showreq = NO), muß       */
  782.    if (!showreq) {                /*der Pfad "von Hand" zusammen-*/
  783.      strcpy(&path[0],&directoryname[0]);    /*gestellt werden.*/
  784.      pos1 = (char *)(&directoryname[0]+((long)strlen(&directoryname[0])-1L));
  785.      pos2 = (char *)(&path[0]+((long)strlen(&path[0])));
  786.      if (!((*pos1 == ':') || (*pos1 == '/') || !*pos1)) {
  787.        *pos2++ = '/';
  788.        *pos2   = 0x00;                /*Stringende*/
  789.       }
  790.      strcat(&path[0],&filename[0]);       
  791.     }
  792.    return(1);
  793.   }
  794.  else
  795.    return(0);
  796. }
  797.  
  798.  
  799.  
  800. /* CompareRequester: öffnet den Requester für die Art des Vergleichs
  801.    Parameter: keine
  802.    Ergebnis : 0 : Abbruch
  803.           1 : GAL   - GAL
  804.           2 : GAL   - Jedec
  805.           3 : Jedec - GAL
  806. */
  807. int CompareRequester()
  808. {
  809. struct    IntuiMessage    *imsg;
  810. ULONG    class;
  811. USHORT    code,gadID;
  812.  
  813.  if (Request(&cmpreq,window)) {
  814.      for (;;) {
  815.        imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
  816.        if (!imsg) WaitPort (window->UserPort);
  817.        else {
  818.          class = imsg->Class;
  819.      code  = imsg->Code;
  820.      if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
  821.         ReplyMsg(imsg);
  822.      if (class == VANILLAKEY) {
  823.        switch(code) {
  824.          case '1':
  825.             EndRequest(&cmpreq,window);
  826.             return(1);
  827.          case '2':
  828.             EndRequest(&cmpreq,window);
  829.             return(2);
  830.          case '3':
  831.             EndRequest(&cmpreq,window);
  832.             return(3);
  833.          case 0x1B:
  834.          case 'a' :
  835.               EndRequest(&cmpreq,window);
  836.             return(0);
  837.         }
  838.       }
  839.      if (class == GADGETUP) {
  840.        switch (gadID) {
  841.          case NO_GADID: {
  842.         EndRequest(&cmpreq,window);
  843.         return(0);
  844.           }
  845.          case GALGAL_GADID: {
  846.         EndRequest(&cmpreq,window);
  847.         return(1);
  848.           }
  849.          case GALJEDEC_GADID: {
  850.         EndRequest(&cmpreq,window);
  851.         return(2);
  852.           }
  853.          case JEDECGAL_GADID: {
  854.         EndRequest(&cmpreq,window);
  855.         return(3);
  856.           }
  857.         }
  858.       }
  859.         }
  860.       }
  861.    }
  862.  else
  863.    return(0);
  864. }
  865.  
  866.  
  867.  
  868. /* MyRequest:
  869.    öffnet einen Requester und wartet auf die Antwort
  870.    Aufruf: antwort = MyRequest(mode,text);
  871.        mode: CONT_REQ : Requester mit Weiter/Abbruch-Gadgets
  872.          ERR_REQ  : Requester für Fehlermeldungen (Abbruch/Abbruch)
  873.          INFO_REQ : Requester für Informationen (Weiter/Weiter)
  874.          ATYPE_REQ: Requester für A-Typ oder nicht
  875.          GALTYPE_REQ: Öffnet Requester in dem der GAL-Typ eingestellt
  876.            werden kann, falls im Menü "Typ-Requester" eingestellt ist.
  877.            Wenn dies nicht der Fall ist, dann wird ein normaler    
  878.            Frage-Requester ("CONT_REQ") ausgegeben.
  879.        text: Zeiger auf Requester-Text
  880.        antwort: 0=Abbruch oder Fehler, 1=Bestätigung
  881.             bei GALTYPE_REQ:   1 = GAL16V8
  882.                        2 = GAL16V8A
  883.                        3 = GAL20V8
  884.                        4 = GAL20V8A
  885. */
  886. int MyRequest(mode,text)
  887. int    mode;
  888. UBYTE    *text;
  889. {
  890. struct    IntuiMessage    *imsg;
  891. struct    Requester    *myreq;
  892. ULONG    class;
  893. USHORT    code,gadID;
  894. int    width;
  895.  
  896.  
  897.  ITextW.NextText  = NULL;            /*für AType-Req.*/
  898.  
  899.  if (mode == GALTYPE_REQ) {            /* wenn autom. A-Typ, dann*/
  900.    if (Config.AutoAType) {            /* die A-Typ-Gadgets de-*/
  901.      SGadget23.Flags = SGadget23.Flags | GADGDISABLED;    /*aktivieren, sonst*/
  902.      SGadget21.Flags = SGadget21.Flags | GADGDISABLED;    /*aktivieren*/
  903.     }
  904.    else {
  905.      SGadget23.Flags = SGadget23.Flags & ~GADGDISABLED;
  906.      SGadget21.Flags = SGadget21.Flags & ~GADGDISABLED;
  907.     }
  908.   }
  909.  
  910.  if (Config.GALTypeReq && (mode == GALTYPE_REQ)) {
  911.    myreq = &TypeReq;
  912.    SIText20.LeftEdge=(SHORT)(212-strlen(text)*8/2);
  913.    SIText20.IText = text;
  914.   }
  915.  else {
  916.    if (mode == ERASE_REQ) {
  917.      ITextY.IText = (UBYTE *)" Erase ";
  918.      ITextN.IText = (UBYTE *)"Cancel ";
  919.     }
  920.    if (mode == ATYPE_REQ) {
  921.      ITextY.IText = (UBYTE *)"A-Type";
  922.      ITextN.IText = (UBYTE *)"normal";
  923.      ITextW.NextText  = &ATypeTxt;
  924.     }
  925.    if (mode == ERR_REQ) {
  926.      ITextY.IText = (UBYTE *)"Cancel ";
  927.      ITextN.IText = (UBYTE *)"Cancel";
  928.      }   
  929.    if ((mode == CONT_REQ) || (mode == GALTYPE_REQ)) {
  930.      ITextY.IText = (UBYTE *)" Cont";
  931.      ITextN.IText = (UBYTE *)"Cancel ";
  932.     }   
  933.    if (mode == INFO_REQ) {
  934.      ITextY.IText = (UBYTE *)" Cont";
  935.      ITextN.IText = (UBYTE *)" Cont";
  936.     }
  937.  
  938.    if (strlen(text) < 39)
  939.      width = 310;
  940.    else
  941.      width = (int)(strlen(text))*8+10;
  942.  
  943.    ITextW.LeftEdge  = (SHORT)(width/2-strlen(text)*8/2);
  944.    ITextW.IText     = text;
  945.    req.LeftEdge     = 320-width/2;
  946.    req.Width        = width;
  947.    GadgetN.LeftEdge = width-104;
  948.    ReqBorVeca[2] = ReqBorVeca[4] = ReqBorVecb[4] = width-1;
  949.    myreq = &req;
  950.   }
  951.  
  952.  if (Request(myreq,window)) {
  953.      for (;;) {
  954.        imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
  955.        if (!imsg) WaitPort (window->UserPort);
  956.        else {
  957.          class = imsg->Class;
  958.      code  = imsg->Code;
  959.      if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
  960.         ReplyMsg(imsg);
  961.      if (class == VANILLAKEY) {
  962.        if (Config.GALTypeReq && (mode == GALTYPE_REQ)) {
  963.          switch (code) {
  964.            case '1':
  965.           EndRequest(myreq,window);
  966.           SetGALType (GAL16V8,NO);
  967.           return(1);
  968.            case '2':
  969.           if (!Config.AutoAType) {
  970.             EndRequest(myreq,window);
  971.             SetGALType (GAL16V8,YES);
  972.             return(2);
  973.            }
  974.           break;
  975.            case '3':
  976.           EndRequest(myreq,window);
  977.           SetGALType (GAL20V8,NO);
  978.           return(3);
  979.            case '4':
  980.           if (!Config.AutoAType) {
  981.             EndRequest(myreq,window);
  982.             SetGALType (GAL20V8,YES);
  983.             return(4);
  984.            }
  985.           break;
  986.           }
  987.         }
  988.            else
  989.          if (code == 'w') {                /*weiter ?*/
  990.            EndRequest(myreq,window);
  991.            return(1);
  992.           }                        /*ESC oder Abbruch?*/
  993.        if ((code == 0x1B) || (code == 'a')) {
  994.          EndRequest(myreq,window);
  995.          return(0);
  996.         }
  997.       }
  998.      if (class == GADGETUP) {
  999.        switch (gadID) {
  1000.          case YES_GADID:
  1001.           EndRequest(myreq,window);
  1002.         return(1);
  1003.          case NO_GADID:
  1004.         EndRequest(myreq,window);
  1005.         return(0);
  1006.          case 3:
  1007.         EndRequest(myreq,window);
  1008.         SetGALType (GAL16V8,NO);
  1009.         return(1);
  1010.          case 4:
  1011.         EndRequest(myreq,window);
  1012.         SetGALType (GAL16V8,YES);
  1013.         return(2);
  1014.          case 5:
  1015.         EndRequest(myreq,window);
  1016.         SetGALType (GAL20V8,NO);
  1017.         return(3);
  1018.          case 6:
  1019.         EndRequest(myreq,window);
  1020.         SetGALType (GAL20V8,YES);
  1021.         return(4);
  1022.         }
  1023.       }
  1024.         }
  1025.       }
  1026.    }
  1027.  else
  1028.    return(0);
  1029. }
  1030.  
  1031.  
  1032.  
  1033.  
  1034. /* AsmRequester: öffnet den Requester mit den Assembler-Optionen
  1035.    Parameter: keine
  1036.    Ergebnis : 0 : Abbruch
  1037.           1 : Weiter
  1038. */
  1039. int AsmRequester()
  1040. {
  1041. struct    IntuiMessage    *imsg;
  1042. ULONG    class;
  1043. USHORT    code,gadID;
  1044.  
  1045.  if (Request(&asmreq,window)) {
  1046.      for (;;) {
  1047.        imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
  1048.        if (!imsg) WaitPort (window->UserPort);
  1049.        else {
  1050.          class = imsg->Class;
  1051.      code  = imsg->Code;
  1052.      if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
  1053.         ReplyMsg(imsg);
  1054.      if (class == VANILLAKEY) {
  1055.        if (code == 'w') {                /*Weiter ?*/
  1056.          EndRequest(&asmreq,window);
  1057.          return(1);
  1058.         }                        /*ESC oder Abbruch?*/
  1059.        if ((code == 0x1B) || (code == 'a')) {
  1060.          EndRequest(&asmreq,window);
  1061.          return(0);
  1062.         }
  1063.       }
  1064.      if (class == GADGETUP) {
  1065.        switch (gadID) {
  1066.          case WEITER_GADID:
  1067.         EndRequest(&asmreq,window);
  1068.         return(1);
  1069.         break;
  1070.          case ABBRUCH_GADID:
  1071.         EndRequest(&asmreq,window);
  1072.         return(0);
  1073.         break;
  1074.          case JEDEC_GADID:
  1075.         Config.GenJedec = !Config.GenJedec;
  1076.         break;
  1077.          case FUSE_GADID:
  1078.         Config.GenFuse = !Config.GenFuse;
  1079.         break;
  1080.          case CHIP_GADID:
  1081.         Config.GenChip = !Config.GenChip;
  1082.         break;
  1083.          case PIN_GADID:
  1084.         Config.GenPin = !Config.GenPin;
  1085.         break;
  1086.          case AUTOSAVE_GADID:
  1087.         Config.AutoSave = !Config.AutoSave;
  1088.         break;
  1089.          case AUTOGAL_GADID:
  1090.         Config.AutoGAL = !Config.AutoGAL;
  1091.         break;
  1092.         }
  1093.       }
  1094.         }
  1095.       }
  1096.    }
  1097.  else
  1098.    return(0);
  1099. }
  1100.  
  1101.  
  1102.  
  1103.  
  1104. /* FileSize:
  1105.    gibt die Länge einer Datei zurück
  1106.    Aufruf: size=FileSize(filename);
  1107.            filename: Zeiger auf Filenamen
  1108.    Ergebnis: -1 : File existiert nicht
  1109.          -2 : kein Speicher für FileInfoBlock
  1110.         size: Filelänge
  1111. */
  1112. long FileSize(filename)
  1113. UBYTE    *filename;
  1114. {
  1115. struct    FileInfoBlock    *fib;
  1116. struct    FileLock    *lock;
  1117. LONG    filesize;
  1118.  
  1119.  if((lock=(struct FileLock *) Lock(filename,ACCESS_READ))) {
  1120.    fib=(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP);
  1121.    if (fib!=NULL) {
  1122.      if (Examine(lock,fib))
  1123.        filesize=fib->fib_Size;
  1124.      else filesize=-1L;
  1125.      UnLock(lock);
  1126.      FreeMem(fib,(long)sizeof(struct FileInfoBlock));
  1127.      return(filesize);
  1128.     }
  1129.    else
  1130.      return(-2L);                /*Mem-Error*/
  1131.   }
  1132.  else
  1133.    return(-1L);                    /*File existiert nicht*/
  1134. }
  1135.  
  1136.  
  1137. /* ReadFile
  1138.    File einlesen
  1139.    Aufruf: error=ReadFile(filename,filesize,filebuff)
  1140.            filename: Zeiger auf Filenamen
  1141.        filesize: Größe der Datei in Bytes
  1142.        filebuff: Adresse, an die die Datei gelesen werden soll
  1143.    Ergebnis: error: 1=kein Fehler, 0=Fehler
  1144. */
  1145. int ReadFile(filename,filesize,filebuff)
  1146. UBYTE    *filename,*filebuff;
  1147. LONG    filesize;
  1148. {
  1149. long     actlength;
  1150. struct    FileHandle    *fh;
  1151.  
  1152.  if ((fh=Open(filename,MODE_OLDFILE))) {
  1153.    actlength=Read(fh,filebuff,filesize);
  1154.    Close(fh);
  1155.    if (actlength==-1L) return(0);
  1156.    else return(1);
  1157.   }
  1158.  else
  1159.   return(0);
  1160. }
  1161.  
  1162.  
  1163.  
  1164.  
  1165. /*ErrorReq
  1166.   gibt zu einer Fehlernummer den entsprechenden Requester aus
  1167.   Aufruf: ErrorReq(errornum);
  1168.       errornum: Fehlernummer
  1169. */
  1170. void ErrorReq(errornum)
  1171. int errornum;
  1172. {
  1173.  switch (errornum) {
  1174.    case  1:  MyRequest(ERR_REQ,(UBYTE*)"Can't find file!");
  1175.          break;
  1176.    case  2:  MyRequest(ERR_REQ,(UBYTE*)"Not enough free memory!");
  1177.          break;
  1178.    case  3:  MyRequest(ERR_REQ,(UBYTE*)"Can't load file!");
  1179.          break;
  1180.    case  4:  MyRequest(ERR_REQ,(UBYTE*)"File is empty!");
  1181.          break;
  1182.    case  5:  MyRequest(ERR_REQ,(UBYTE*)"Error in JEDEC file!");
  1183.          break;
  1184.    case  6:  MyRequest(ERR_REQ,(UBYTE*)"GAL is not empty!");
  1185.          break;
  1186.    case  7:  MyRequest(ERR_REQ,(UBYTE*)"No pinnames found.");
  1187.          break;
  1188.    case  8:  MyRequest(ERR_REQ,(UBYTE*)"Can't close file!");
  1189.          break;
  1190.    case  9:  MyRequest(ERR_REQ,(UBYTE*)"Bad type of GAL selected!");
  1191.          break;
  1192.    case 10:  MyRequest(ERR_REQ,(UBYTE*)"Can't load 's:GALer.config'!");
  1193.          break;
  1194.    case 11:  MyRequest(ERR_REQ,(UBYTE*)"Can't save 's:GALer.config'!");
  1195.          break;
  1196.    case 12:  MyRequest(ERR_REQ,(UBYTE*)"Can't open window!");
  1197.          break;
  1198.    case 13:  MyRequest(ERR_REQ,(UBYTE*)"Can't save file!");
  1199.          break;
  1200.   }
  1201. }
  1202.  
  1203.  
  1204.  
  1205.  
  1206. /* PrintText
  1207.    gibt Text im Text-Feld aus
  1208.    Aufruf: PrintText(text);
  1209.        text   : Zeiger auf Text
  1210.        newline: 1: ypos auf nächste Zeile
  1211.             0: ypos nicht auf nächste Zeile
  1212.                Aufruf mit newline = 0 eigentlich nur sinnvoll wenn
  1213.                zuvor schon mal mit newline = 1 aufgerufen wurde
  1214.                Anwendungsbeispiel:
  1215.              PrintText("führe Verify durch...",1);
  1216.              Nach erfolgreichem Verify: PrintText(" O.K.",0);
  1217.              =>  "führe Verify durch... O.K."
  1218. */
  1219. void PrintText(text, newline)
  1220. UBYTE    *text;
  1221. int    newline;
  1222. {
  1223. static    long  delta_x;
  1224.  
  1225.  if (newline)
  1226.    if (ytxt<190)
  1227.      ytxt+=10;
  1228.    else
  1229.      ScrollRaster(rp,0L,10L,31L,162L,609L,194L);
  1230.  
  1231.  if (newline)
  1232.    Move(rp,40L,(long)ytxt);
  1233.  else
  1234.    Move(rp,40L+delta_x,(long)ytxt);
  1235.  
  1236.  Text(rp,text,(long)strlen(text));
  1237.  delta_x = (long)strlen(text)*8L;
  1238. }
  1239.  
  1240.  
  1241.  
  1242. /*gibt "Fehler in Zeile xyz" aus
  1243.   Aufruf: PrintErrorLine(line);
  1244.       line: Zeilennummer
  1245. */
  1246. void PrintErrorLine(line)
  1247. int line;
  1248. {
  1249.  sprintf(&ErrorLineStr[16],"%4d:",line);
  1250.  PrintText(&ErrorLineStr[0],1);
  1251. }
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258. /* Voreinstellungen laden ("s:GALer.config") und Menüs, Gadgets, usw.
  1259.    entsprechend einstellen
  1260. */
  1261. void LoadConfig()
  1262. {
  1263. long     filelength;
  1264. struct    FileHandle    *fh;
  1265.  
  1266.  if ((fh = Open((UBYTE *)"s:GALer.config",MODE_OLDFILE))) {
  1267.    filelength = Read(fh,&DummyConfig,(long)sizeof(struct Configuration));
  1268.    Close(fh);
  1269.    if (filelength == -1L)
  1270.      ErrorReq(10); 
  1271.    else                    /* kein Fehler beim Lesen?*/
  1272.      Config = DummyConfig;        /* dann Config übernehmen*/
  1273.   }
  1274.  
  1275.   GALType = Config.GALType;                /*GAL-Typ einstellen*/
  1276.  
  1277.   if (GALType == GAL16V8) {
  1278.     GALType = GAL16V8;
  1279.     MaxFuseAdr = MAX_FUSE_ADR16;
  1280.     SigAdr     = SIG_ADR16;
  1281.     SetGAL  (GAL16V8);
  1282.     DrawGAL (GAL16V8);
  1283.     strncpy (&title[59], (char *)"GAL16V8", 7);
  1284.     MenuItem13.Flags |= CHECKED;        /*GAL16V8-Menü*/
  1285.    } 
  1286.   else {
  1287.     GALType = GAL20V8;
  1288.     MaxFuseAdr = MAX_FUSE_ADR20;
  1289.     SigAdr     = SIG_ADR20;
  1290.     SetGAL  (GAL20V8);
  1291.     DrawGAL (GAL20V8);
  1292.     strncpy (&title[59], (char *)"GAL20V8", 7);
  1293.     MenuItem13b.Flags |= CHECKED;             /*GAL20V8-Menü*/
  1294.    }
  1295.  
  1296.   if (Config.AType)
  1297.     title[67] = 'A';
  1298.   else
  1299.     title[67] = ' ';
  1300.   SetWindowTitles(window,-1L,(UBYTE*)title);
  1301.  
  1302.   if (Config.AType)
  1303.     MenuItem14b.Flags |= CHECKED;             /*A-Typ-Menü*/
  1304.  
  1305.   if (Config.AutoAType) {                /*Auto-A-Typ*/
  1306.     MenuItem14b.Flags = MenuItem14b.Flags & ~ITEMENABLED; /*A-Typ-Menü*/
  1307.     MenuItem14a.Flags |= CHECKED;              /*Auto A-Typ-Menü*/
  1308.    }
  1309.  
  1310.   if (Config.GALTypeReq)
  1311.     MenuItem14.Flags |= CHECKED;         /*Typ-Requester-Menü*/
  1312.  
  1313.   if (Config.GenJedec)
  1314.     SGadget1.Flags  |= SELECTED;
  1315.   if (Config.GenFuse)
  1316.     SGadget2.Flags  |= SELECTED;
  1317.   if (Config.GenChip)
  1318.     SGadget3.Flags  |= SELECTED;
  1319.   if (Config.GenPin)
  1320.     SGadget4.Flags  |= SELECTED;
  1321.   if (Config.AutoSave)
  1322.     SGadget5.Flags  |= SELECTED;
  1323.   if (Config.AutoGAL)
  1324.     SGadget9.Flags  |= SELECTED;
  1325.   if (Config.JedecSecBit)
  1326.     SGadget51.Flags |= SELECTED;
  1327.   if (Config.JedecFuseChk)
  1328.     SGadget52.Flags |= SELECTED;
  1329.   if (Config.JedecFileChk)
  1330.     SGadget53.Flags |= SELECTED;
  1331.  
  1332.   if (Config.ProgEmptyTest)
  1333.     SGadget42.Flags |=  SELECTED;
  1334.   if (Config.ProgVerify)
  1335.     SGadget43.Flags |= SELECTED;
  1336.   if (Config.CopyEmptyTest)
  1337.     SGadget44.Flags |= SELECTED;
  1338.   if (Config.CopyVerify)
  1339.     SGadget45.Flags |= SELECTED;
  1340.   if (Config.EraseEmptyTest)
  1341.     SGadget46.Flags |= SELECTED;
  1342.  
  1343. }
  1344.  
  1345.  
  1346. /* Voreinstellungen sichern -  File "s:GALer.config"*/
  1347. void SaveConfig()
  1348. {
  1349. long     filelength;
  1350. struct    FileHandle    *fh;
  1351.  
  1352.  Config.GALType = GALType;
  1353.  if ((fh = Open((UBYTE *)"s:GALer.config",MODE_NEWFILE))) {
  1354.    filelength = Write(fh,&Config,(long)sizeof(struct Configuration));
  1355.    Close(fh);
  1356.    if (filelength == -1L)
  1357.      ErrorReq(11);
  1358.   }
  1359.  else
  1360.   ErrorReq(11);
  1361.  
  1362. }
  1363.  
  1364.  
  1365.  
  1366. /* SetGALType: alle Variablen usw. auf den gewünschten GAL-Typ einstellen
  1367.    Aufruf:     SetGALType(galtype, atype);
  1368.    Parameter:  galtype = GAL16V8 oder GAL20V8
  1369.            atype   = YES : GAL vom Typ A
  1370.              NO  : "normales" GAL
  1371. */
  1372. void SetGALType(galtype, atype)
  1373. int    galtype, atype;
  1374. {
  1375.  
  1376.  if ((galtype == GAL16V8) && (GALType != GAL16V8)) {
  1377.    GALType = GAL16V8;
  1378.    MaxFuseAdr = MAX_FUSE_ADR16;
  1379.    SigAdr     = SIG_ADR16;
  1380.    SetGAL  (GAL16V8);
  1381.    DrawGAL (GAL16V8);
  1382.    strncpy (&title[59], (char *)"GAL16V8", 7);
  1383.    MenuItem13.Flags  |= CHECKED;        /*GAL16V8-Menü*/
  1384.    MenuItem13b.Flags &= (~CHECKED);        /*GAL20V8-Menü*/
  1385.   }
  1386.  if ((galtype == GAL20V8) && (GALType != GAL20V8)) {
  1387.    GALType = GAL20V8;
  1388.    MaxFuseAdr = MAX_FUSE_ADR20;
  1389.    SigAdr     = SIG_ADR20;
  1390.    SetGAL  (GAL20V8);
  1391.    DrawGAL (GAL20V8);
  1392.    strncpy (&title[59], (char *)"GAL20V8", 7);
  1393.    MenuItem13.Flags  &= (~CHECKED);        /*GAL20V8-Menü*/
  1394.    MenuItem13b.Flags |= CHECKED;        /*GAL20V8-Menü*/
  1395.   }
  1396.  
  1397.  if (!Config.AutoAType) {        /*A-Typ nur ändern, wenn keine*/
  1398.    Config.AType = atype;        /*autom. A-Typ-Einstellung*/
  1399.    if (Config.AType) {
  1400.      title[67] = 'A';
  1401.      MenuItem14b.Flags |= CHECKED;        /*A-Typ-Menü*/
  1402.     }
  1403.    else {
  1404.      title[67] = ' ';
  1405.      MenuItem14b.Flags &= (~CHECKED);        /*A-Typ-Menü*/
  1406.     }
  1407.   }
  1408.  
  1409.  SetWindowTitles(window,-1L,(UBYTE*)title);
  1410. }
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417. /* Die Routienen  "AddByte", "AddString", "IncPointer", "DecPointer" und
  1418.    "FreeBuffer" erleichtern die Erstellung und Bearbeitung von verketteten
  1419.    Speicherlisten.
  1420. */
  1421.  
  1422.  
  1423. /*AddByte:   Schreibt das Byte "code" in den Puffer. Wenn das Ende des
  1424.          Puffers erreicht ist, wird ein neuer erstellt
  1425.          (Struktur Buffer).
  1426.   Aufruf   : result = AddByte(buff,code);
  1427.   Einsprung: code: Byte das in den Puffer an die Position "buff"
  1428.          geschrieben werden soll, "buff" wird anschließend um eins erhöht
  1429.          buff: Zeiger auf ActBuffer-Struktur
  1430.   Ergebnis:  Returnwert = 0: alles o.k.    sonst: Fehler (kein Speicher)
  1431.          buff enthält neuen Entry-Zeiger und den entsprechenden Puffer-
  1432.          Anfang und das Ende
  1433. */
  1434. int AddByte(buff,code)
  1435. struct    ActBuffer    *buff;
  1436. UBYTE    code;
  1437. {
  1438. struct    Buffer    *mybuff;
  1439.  
  1440.  if ((buff->Entry) < (buff->BuffEnd)) {        /*noch im Puffer?*/
  1441.    *buff->Entry++ = code;            /*ja, dann Byte eintragen*/
  1442.   }
  1443.  else {                    /*nein, dann neuen Puffer erstellen*/
  1444.    if (!(mybuff = (struct Buffer *)AllocMem((long)sizeof(struct Buffer),MEMF_PUBLIC|MEMF_CLEAR))) {
  1445.      ErrorReq(2);            /*kein Speicher mehr->Fehlermeldung*/
  1446.      return(-1);
  1447.     }
  1448.    buff->ThisBuff->Next   = mybuff;    /*neuer Puffer ist aktueller*/
  1449.    mybuff->Prev   = buff->ThisBuff;    /*vorheriger Puffer ist alter*/
  1450.    buff->ThisBuff = mybuff;        /*aktueller Puffer ist neuer*/
  1451.    buff->Entry    = (UBYTE *)(&mybuff->Entries[0]);
  1452.    buff->BuffEnd  = (UBYTE *)mybuff + (long)sizeof(struct Buffer);
  1453.    *buff->Entry++ = code;
  1454.   }
  1455.  return(0);
  1456. }
  1457.  
  1458.  
  1459.  
  1460. /*AddString: Schreibt den String "strnptr" in den Puffer. Wenn das Ende des
  1461.          Puffers erreicht ist, wird ein neuer erstellt.
  1462.          (Struktur Buffer).
  1463.   Aufruf   : result = AddString(buff,strnptr);
  1464.   Einsprung: strnptr: Zeiger auf String der in den Puffer an die Position
  1465.          "buff" geschrieben werden soll, "buff" zeigt zum Schluß auf
  1466.          das lezte Zeichen im String + 1.
  1467.          buff: Zeiger auf ActBuffer-Struktur
  1468.   Ergebnis:  Returnwert = 0: alles o.k.    sonst: Fehler (kein Speicher)
  1469.          buff enthält neuen Entry-Zeiger und den entsprechenden Puffer-
  1470.          Anfang und das Ende
  1471. */
  1472. int AddString(buff, strnptr)
  1473. struct    ActBuffer *buff;
  1474. UBYTE    *strnptr;
  1475. {
  1476.   while (*strnptr) {
  1477.     if (AddByte(buff,*strnptr++))
  1478.       return(-1);
  1479.    }
  1480. }
  1481.  
  1482.  
  1483. /*IncPointer:   Zeiger  auf nächsten Eintrag im verketten Puffer
  1484.  
  1485.    Aufruf:     IncPointer(buff);
  1486.    Parameter:    buff            : Zeiger auf ActBuffer-Struktur
  1487.    Ergebnis :    buff->Entry   : zeigt auf nächstes Zeichen im Puffer
  1488.         buff->BuffEnd : zeigt auf das Ende des Puffers, in den
  1489.                     Entry zeigt
  1490.         buff->ThisBuff: zeigt auf Puffer-Anfang
  1491. ACHTUNG: es erfolgt keine Abfrage, ob das Ende des gesamten Puffers
  1492.      schon erreicht ist
  1493. */
  1494. void IncPointer(buff)
  1495. struct    ActBuffer    *buff;
  1496. {
  1497.  
  1498.  buff->Entry++;
  1499.  if (buff->Entry == buff->BuffEnd) {    /*Pufferende erreicht?*/
  1500.    buff->ThisBuff = buff->ThisBuff->Next; /*ja, dann auf nächsten Puffer*/
  1501.    buff->Entry    = (UBYTE *)(&buff->ThisBuff->Entries[0]);
  1502.    buff->BuffEnd  = (UBYTE *)buff->ThisBuff + (long)sizeof(struct Buffer);
  1503.   }
  1504.  
  1505. }
  1506.  
  1507.  
  1508. /*DecPointer:   Zeiger  auf vorigen Eintrag im verketten Puffer
  1509.  
  1510.    Aufruf:      IncPointer(buff);
  1511.    Parameter:    buff            : Zeiger auf ActBuffer-Struktur
  1512.    Ergebnis :    buff->Entry   : zeigt auf voriges Zeichen im Puffer
  1513.         buff->BuffEnd : zeigt auf das Ende des Puffers, in den
  1514.                     Entry zeigt
  1515.         buff->ThisBuff : zeigt auf Puffer-Anfang
  1516. ACHTUNG: es erfolgt keine Abfrage, ob der Anfang des gesamten Puffers
  1517.      schon erreicht ist
  1518. */
  1519. void DecPointer(buff)
  1520. struct    ActBuffer  *buff;
  1521. {
  1522.  
  1523.  buff->Entry--;
  1524.  if (buff->Entry < &buff->ThisBuff->Entries[0]) { /*Pufferanfang erreicht?*/
  1525.    buff->ThisBuff = buff->ThisBuff->Prev;    /*dann auf vorigen Puffer*/
  1526.    buff->BuffEnd  = (UBYTE *)buff->ThisBuff + (long)sizeof(struct Buffer);
  1527.    buff->Entry    = (UBYTE *)((buff->BuffEnd)-1L);
  1528.   }
  1529.  
  1530. }
  1531.  
  1532.  
  1533. /*FreeBuffer:   gibt die verketteten Puffer wieder frei
  1534.  Aufruf:      FreeBuffer(buff);
  1535.  Einsprung:   buff: Zeiger auf ersten Speicherblock
  1536.  Ergebnis :   ---
  1537. */
  1538. void FreeBuffer(buff)
  1539. struct    Buffer    *buff;
  1540. {
  1541. struct    Buffer    *nextbuff;
  1542.  
  1543.  do {
  1544.    nextbuff = buff->Next;
  1545.    FreeMem(buff,(long)sizeof(struct Buffer)); }
  1546.  while (buff = nextbuff);
  1547. }
  1548.  
  1549.  
  1550.  
  1551.  
  1552.